package com.gwl.concurrent.simple;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

class TaskWithResult implements Callable<String> {
	
	private int id; 
	public TaskWithResult(int id) { 
		this.id = id; 
	}
	
	@Override
	public String call() throws Exception {
		return "id: " + id; 
	}
	
}
public class CallableDemo {

	public static void main(String[] args) {
		ExecutorService exec = Executors.newCachedThreadPool(); 
		Queue<Future<String>> futures = new LinkedList<Future<String>>(); 
		for(int i=0; i<10; i++) { 
			futures.add(
					exec.submit(new TaskWithResult(i)));  
		} 
		for(Future<String> future: futures) { 
			try{ 
				System.out.println(future.get()); 
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally { 
				exec.shutdown(); 
			}
		}
		
	}
	
}
